addとdeserializeが低コストなログ用の形式が欲しい、、欲しくない?


概要

まあ特殊なニーズなんですけど、ログを取るとき、追記可能でかつイザって時に

特定の言語向けにdeserializeできる形式が欲しい。



用途

例えば、ログ自体からオブジェクト作り出して、実行可能な情報として動作させたい。

んでその際、独自形式を作りたくない。



現状

tomlが一番欲しい物に近いかなって思っている。



例えばjsonでログを取る(この表現が既に狂気なのは承知してる)とかだと、

次のようなログになるとして、



log.json

[

    {

        "key1": "val1",

        "key2": "val2",

        "date": "2015/03/0819: 58: 39"

    }

]


で、


追記するためには、とじカッコとかその辺がクソみたいな感じで邪魔になる。


log.json

[

    {

        "key1": "val1",

        "key2": "val2",

        "date": "2015/03/0819: 58: 39"

    },

    {

        "key1": "val1",

        "key2": "val2",

        "date": "2015/03/0820: 00: 23"

    }

]


濃い部分が追記された内容。

単純に改行 + α、、みたいな感じにはならない。

正しくやるには、

original -> parse -> add -> serialize


みたいな行程を経ないといけない。

こんなことでっかくなりつづけるファイルに対してやってられない。


original -> add 


だけで済み、かつdeserializeできる形式が欲しい。



tomlさん出番です

そのへんtomlさんは凄い。できる子。


log.toml

[identity]

date = "2015/03/0819: 58: 39"

key1 = "val1"

key2 = "val2"


追記するとして


log.toml

[identity]

date = "2015/03/0819: 58: 39"

key1 = "val1"

key2 = "val2"

[identity2]

date = "2015/03/0820: 00: 23"

key1 = "val1"

key2 = "val2"


とかにできる。

まあ書き込みがアトム~な感じじゃないと成立しないのはどっちも一緒。


identityに関しては、同じ対象であれば同じ値を使う、とかすると、deserialize時に折り畳まれる。時系列に並べたければ主キーをdate or 何かにすればいいのではという感じ。

逆に、deserializeでshrinkされること自体が特性っちゃあ特性で、


時間を適当なインターバルでゾーン分けすると、特定のタイムスパンで起きた出来事を一気に見やすくできる。

こんな感じ。


[datezone]

    [datezone.id1]

    date = "2015/03/0820: 00: 23"

    key1 = "val1"

    key2 = "val2"

[datezone]

    [datezone.id2]

    date = "2015/03/0820: 00: 49"

    key1 = "val1"

    key2 = "val2"


datezoneは適当な[1分間以内に発生した物事の区分]とかにしたと仮定する。

これはjsonだと下記と=になる。


{

  "datezone": {

    "id1": {

      "date": "2015/03/0820: 00: 23",

      "key1": "val1",

      "key2": "val2"

    },

    "id2": {

      "date": "2015/03/0820: 00: 23",

      "key1": "val1",

      "key2": "val2"

    }

  }

}


書き込みやすさと情報量に対して、一気に差がつく感じ。



どこかにメモっておきたかった。